<?php
/**
 * Created by 无所谓已
 * User: Administrator
 * Date: 2025-10-02
 * Time: 15:32
 */

namespace plugin\csauto\app\process;

use app\service\StableWorkerIdService;
use plugin\admin\app\model\Rule;
use plugin\csauto\app\model\SiteModel;
use plugin\csauto\app\service\ApiWorkService;
use plugin\csauto\app\service\downloader\TorrentTaskService;
use plugin\csauto\app\service\NcServerService;
use plugin\csauto\app\service\SiteWorkService;
use plugin\csauto\app\service\SystemService;
use Shopwwi\LaravelCache\Cache;
use Workerman\Timer;
use function Symfony\Component\Clock\now;

/**
 * Class SystemInitProcess
 * 初始化引擎
 *
 * @package plugin\csauto\app\process
 */
class SystemUpdateGitProcess
{
    // 定时器句柄/ID
    protected $timer;
    protected $wechatTimer;
    protected $ncTimer;

    // 时间间隔 (单位: 秒, 默认5秒)
    protected $interval = 1800;

    // NC服务器检查间隔 (单位: 秒, 默认半小时)
    protected $ncCheckInterval = 1800;

    public function onWorkerStart()
    {
  
        $this->timer = Timer::add($this->interval, function () {
            try {
                // 这里执行系统预设的定时任务事件
                $this->run();
            } catch (\Throwable $e) {
                echo 'ERROR[SystemInitProcess]: ' . $e->getMessage() . PHP_EOL;
            }
        });
        if (getenv('WORK_DEBUG')) return true;
        $this->checkNcServerThrottling();
        // 添加NC服务器限速检查定时器，每半小时执行一次
        $this->ncTimer = Timer::add($this->ncCheckInterval, function () {
            try {
                // 检查NC服务器限速状态
                $this->checkNcServerThrottling();
            } catch (\Throwable $e) {
                echo 'ERROR[NcServerCheck]: ' . $e->getMessage() . PHP_EOL;
            }
        });

        return true;
    }

    public function run()
    {
        addlog('GIT_UPDATE', '开始检查Git更新');
        try {
            // 获取项目根目录
            $rootPath = base_path();

            // 切换到项目根目录
            chdir($rootPath);

            // 检查当前目录是否为 git 仓库
            $checkGit = shell_exec('git rev-parse --is-inside-work-tree 2>&1');
            if (trim($checkGit) !== 'true') {
                addlog('GIT_UPDATE', '当前目录不是有效的 git 仓库', 'error');
                return;
            }

            // 获取当前分支
            $currentBranch = trim(shell_exec('git rev-parse --abbrev-ref HEAD'));

            // 获取远程仓库URL并验证是否为目标仓库
            $remoteUrl = trim(shell_exec('git remote get-url origin'));
            if ($remoteUrl !== 'https://gitee.com/lumingjie/cs-auto-core.git') {
                addlog('GIT_UPDATE', "远程仓库地址不匹配: {$remoteUrl}", 'error');
                return;
            }

            // 获取本地最新 commit hash
            $localHash = trim(shell_exec('git rev-parse HEAD'));

            // 获取远程最新 commit hash
            shell_exec('git fetch origin');
            $remoteHash = trim(shell_exec("git rev-parse origin/{$currentBranch}"));

            // 比较本地和远程版本
            if ($localHash !== $remoteHash) {
                addlog('GIT_UPDATE', '检测到新版本，开始自动更新...');

                // 执行 git pull 更新代码
                $output = [];
                $returnCode = 0;
                exec('git pull origin ' . $currentBranch . ' 2>&1', $output, $returnCode);

                if ($returnCode === 0) {
                    addlog('GIT_UPDATE', '代码更新成功');
                    
                    // 获取更新详细信息
                    $updateInfo = implode("\n", $output);
                    $currentVersion = SystemService::getConfig(SystemService::SYSTEM_VERSION) ?: '未知版本';
                    
                    // 发送IYUU通知
                    $title = '系统更新成功通知';
                    $content = "## 系统更新成功\n\n";
                    $content .= "**更新时间：** " . date('Y-m-d H:i:s') . "\n\n";
                    $content .= "**当前版本：** {$currentVersion}\n\n";
                    // $content .= "**更新分支：** {$currentBranch}\n\n";
                    // $content .= "**更新详情：**\n```\n{$updateInfo}\n```\n\n";
                    $content .= "系统已自动拉取最新代码，请检查服务运行状态。";
                    
                    SystemService::sendIyuNotification($title, $content);
                    
                    // 如果有更新，可以在这里添加其他操作，如重启服务等
                    // 例如: $this->reloadServices();
                } else {
                    addlog('GIT_UPDATE', "代码更新失败: " . implode("\n", $output), 'error');
                    
                    // 更新失败也发送通知
                    $errorInfo = implode("\n", $output);
                    $title = '系统更新失败通知';
                    $content = "## 系统更新失败\n\n";
                    $content .= "**更新时间：** " . date('Y-m-d H:i:s') . "\n\n";
                    // $content .= "**更新分支：** {$currentBranch}\n\n";
                    // $content .= "**错误信息：**\n```\n{$errorInfo}\n```\n\n";
                    $content .= "请及时检查并处理更新失败的问题。";
                    
                    SystemService::sendIyuNotification($title, $content);
                }
            } else {
                addlog('GIT_UPDATE', '当前已是最新版本');
            }
        } catch (\Exception $e) {
            addlog('GIT_UPDATE', "检查更新时发生错误: " . $e->getMessage(), 'error');
        }
    }

    /**
     * 检查NC服务器限速状态
     */
    public function checkNcServerThrottling()
    {
        // 调用统一的 NC 服务器检查服务
        NcServerService::checkNcServerThrottling();
    }
}